package br.com.fiap.financas.activity ;

import java.text.DateFormat ;
import java.text.SimpleDateFormat ;
import java.util.ArrayList ;
import java.util.GregorianCalendar ;
import java.util.Locale ;

import br.com.fiap.R;
import br.com.fiap.financas.adapter.CalendarAdapter;

import android.app.Activity ;
import android.os.Bundle ;
import android.os.Handler ;
import android.view.View ;
import android.view.View.OnClickListener ;
import android.widget.AdapterView ;
import android.widget.AdapterView.OnItemClickListener ;
import android.widget.GridView ;
import android.widget.RelativeLayout ;
import android.widget.TextView ;
import android.widget.Toast ;

public class CalendarView extends Activity
{
	public GregorianCalendar month, itemmonth ;

	public CalendarAdapter adapter ;
	public Handler handler ;
	public ArrayList<String> items ; 

	public void onCreate( Bundle savedInstanceState )
	{
		super.onCreate( savedInstanceState ) ;
		setContentView( R.layout.calendar ) ;
		Locale.setDefault( Locale.US ) ;
		month = ( GregorianCalendar ) GregorianCalendar.getInstance( ) ;
		itemmonth = ( GregorianCalendar ) month.clone( ) ;

		items = new ArrayList<String>( ) ;
		adapter = new CalendarAdapter( this, month ) ;

		GridView gridview = ( GridView ) findViewById( R.id.gridview ) ;
		gridview.setAdapter( adapter ) ;

		handler = new Handler( ) ;
		handler.post( calendarUpdater ) ;

		TextView title = ( TextView ) findViewById( R.id.title ) ;
		title.setText( android.text.format.DateFormat.format( "MMMM yyyy", month ) ) ;

		RelativeLayout previous = ( RelativeLayout ) findViewById( R.id.previous ) ;

		previous.setOnClickListener( new OnClickListener( )
		{

			@Override
			public void onClick( View v )
			{
				setPreviousMonth( ) ;
				refreshCalendar( ) ;
			}
		} ) ;

		RelativeLayout next = ( RelativeLayout ) findViewById( R.id.next ) ;
		next.setOnClickListener( new OnClickListener( )
		{

			@Override
			public void onClick( View v )
			{
				setNextMonth( ) ;
				refreshCalendar( ) ;

			}
		} ) ;

		gridview.setOnItemClickListener( new OnItemClickListener( )
		{
			public void onItemClick( AdapterView<?> parent, View v, int position, long id )
			{

				( ( CalendarAdapter ) parent.getAdapter( ) ).setSelected( v ) ;
				String selectedGridDate = CalendarAdapter.dayString.get( position ) ;
				String[ ] separatedTime = selectedGridDate.split( "-" ) ;
				String gridvalueString = separatedTime[ 2 ].replaceFirst( "^0*", "" ) ;
				int gridvalue = Integer.parseInt( gridvalueString ) ;
				if (( gridvalue > 10 ) && ( position < 8 ))
				{
					setPreviousMonth( ) ;
					refreshCalendar( ) ;
				}
				else if (( gridvalue < 7 ) && ( position > 28 ))
				{
					setNextMonth( ) ;
					refreshCalendar( ) ;
				}
				( ( CalendarAdapter ) parent.getAdapter( ) ).setSelected( v ) ;

				showToast( selectedGridDate ) ;

			}
		} ) ;
	}

	protected void setNextMonth( )
	{
		if (month.get( GregorianCalendar.MONTH ) == month
				.getActualMaximum( GregorianCalendar.MONTH ))
		{
			month.set( ( month.get( GregorianCalendar.YEAR ) + 1 ),
					month.getActualMinimum( GregorianCalendar.MONTH ), 1 ) ;
		}
		else
		{
			month.set( GregorianCalendar.MONTH, month.get( GregorianCalendar.MONTH ) + 1 ) ;
		}

	}

	protected void setPreviousMonth( )
	{
		if (month.get( GregorianCalendar.MONTH ) == month
				.getActualMinimum( GregorianCalendar.MONTH ))
		{
			month.set( ( month.get( GregorianCalendar.YEAR ) - 1 ),
					month.getActualMaximum( GregorianCalendar.MONTH ), 1 ) ;
		}
		else
		{
			month.set( GregorianCalendar.MONTH, month.get( GregorianCalendar.MONTH ) - 1 ) ;
		}

	}

	protected void showToast( String string )
	{
		Toast.makeText( this, string, Toast.LENGTH_SHORT ).show( ) ;

	}

	public void refreshCalendar( )
	{
		TextView title = ( TextView ) findViewById( R.id.title ) ;

		adapter.refreshDays( ) ;
		adapter.notifyDataSetChanged( ) ;
		handler.post( calendarUpdater ) ; 

		title.setText( android.text.format.DateFormat.format( "MMMM yyyy", month ) ) ;
	}

	public Runnable calendarUpdater = new Runnable( )
	{

		@Override
		public void run( )
		{
			items.clear( ) ;

			DateFormat df = new SimpleDateFormat( "yyyy-MM-dd", Locale.US ) ;
			String itemvalue ;
			for (int i = 0; i < 7; i++)
			{
				itemvalue = df.format( itemmonth.getTime( ) ) ;
				itemmonth.add( GregorianCalendar.DATE, 1 ) ;
				items.add( "2012-09-12" ) ;
				items.add( "2012-10-07" ) ;
				items.add( "2012-10-15" ) ;
				items.add( "2012-10-20" ) ;
				items.add( "2012-11-30" ) ;
				items.add( "2012-11-28" ) ;
			}

			adapter.setItems( items ) ;
			adapter.notifyDataSetChanged( ) ;
		}
	} ;
}
